import { Router, RouteLocationNormalized, NavigationGuardNext } from 'vue-router';
import permission from './permission'; // 假设你已经有了权限校验类
/** 【文件说明】：路由守卫类，用于实现全局或局部的路由跳转前后的逻辑判断。
 *  【使用例子】：
    //在你的主文件（通常是 main.ts 或 router/index.ts）中使用这个路由守卫类：

    // 初始化路由守卫
    const routeGuard = new RouteGuard(router);

    // 添加局部路由守卫
    routeGuard.addLocalGuard('Home', (to, from, next) => {
    console.log('Local Guard for Home:', to, from);
    // 可以在这里添加额外的局部守卫逻辑
    next();
    });

 */
class RouteGuard {
  private router: Router;

  /**
   * 构造函数，初始化路由实例。
   * @param router - Vue Router 实例。
   */
  constructor(router: Router) {
    this.router = router;
    this.initGlobalGuards();
  }

  /**
   * 初始化全局路由守卫。
   */
  private initGlobalGuards(): void {
    this.router.beforeEach(this.globalBeforeEach);
    this.router.afterEach(this.globalAfterEach);
  }

/**
   * 全局 beforeEach 守卫，用于在每次路由跳转前执行逻辑判断。
   * @param to - 即将要进入的目标路由对象。
   * @param from - 当前导航正要离开的路由对象。
   * @param next - 必须调用此方法以 resolve 这个钩子。
   */
private globalBeforeEach(to: RouteLocationNormalized, from: RouteLocationNormalized, next: NavigationGuardNext): void {
    const requiresAuth = to.meta.requiresAuth; //请求验证
    const requiresPermissions = to.meta.requiresPermissions;

    if (requiresAuth && !this.isAuthenticated()) {
      next({ name: 'Login' }); // 如果需要认证但用户未登录，则重定向到登录页
    } else if (Array.isArray(requiresPermissions) && !this.hasRequiredPermissions(requiresPermissions)) {
      next({ name: 'NoPermission' }); // 如果需要特定权限但用户没有该权限，则重定向到无权限页
    } else {
      next(); // 否则继续导航
    }
  }
  /**
   * 全局 afterEach 守卫，用于在每次路由跳转后执行逻辑判断。
   * @param to - 即将要进入的目标路由对象。
   * @param from - 当前导航正要离开的路由对象。
   */
  private globalAfterEach(to: RouteLocationNormalized, from: RouteLocationNormalized): void {
    console.log(`Navigated from ${from.fullPath} to ${to.fullPath}`);
    // 可以在这里添加其他全局的 after 钩子逻辑
  }

  /**
   * 检查用户是否已认证。
   * @returns 如果用户已认证，则返回 true；否则返回 false。
   */
  private isAuthenticated(): boolean {
    // 这里可以根据你的实际情况进行认证检查
    // 例如，从 localStorage 中获取 token 或者从 Vuex store 中获取用户信息
    return !!localStorage.getItem('token');
  }

  /**
   * 检查用户是否具有所有指定的权限。
   * @param permissions - 要检查的权限数组。
   * @returns 如果用户具有所有指定的权限，则返回 true；否则返回 false。
   */
  private hasRequiredPermissions(permissions: string[]): boolean {
    return permission.hasAllPermissions(permissions);
  }

  /**
   * 添加局部路由守卫。
   * @param routeName 路由名称。
   * @param guard 局部守卫函数。
   */
  public addLocalGuard(routeName: string, guard: (to: RouteLocationNormalized, from: RouteLocationNormalized, next: NavigationGuardNext) => void): void {
    const route = this.router.getRoutes().find(r => r.name === routeName);
    if (route) {
      route.beforeEnter = guard;
    } else {
      console.warn(`Route with name ${routeName} not found.`);
    }
  }
}

export default RouteGuard;